package com.qf.autoconfig;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@EnableConfigurationProperties(DSProperties.class)
public class MyBatisAutoConfig {

    @Autowired
    private DSProperties dsProperties;

    //DataSource
    @Bean
    public DataSource getDs(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(dsProperties.getDriver());
        ds.setUrl(dsProperties.getUrl());
        ds.setUsername(dsProperties.getUsername());
        ds.setPassword(dsProperties.getPassword());

        return ds;
    }


    //SqlSessionFactoryBean
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource ds){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(ds);
        return sqlSessionFactoryBean;
    }

    //MapperScannerConfigurer

    /**
     * 这个对象比较特使，他是一个bean工厂的后置处理器
     * 这个后置处理器必须优先于其他的组件对象被创建.所以之前我们的处理方式是给这个方法加static修饰
     * 这里我们把这个对象放在Configuration修饰的类中，即使不加static也是可以的，因为Configuration修饰的类中的内容会被优先处理
     *
     * 但是在这个自动配置类中，引入了private DSProperties dsProperties;，但是对象不是有这个配置类生活，所以如果在这里面处理
     * MapperScannerConfigurer，会导致dsProperties无法注入。
     * @return
     */
//    public MapperScannerConfigurer mapperScannerConfigurer(){
//        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//        mapperScannerConfigurer.setBasePackage("");
//
//        return mapperScannerConfigurer;
//    }

}
